/**
 * Copyright (c) 2008,中企动力华南研发中心
 * All rights reserved.
 */
package com.ce.pms.base.dao;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;

import com.sitechasia.webx.core.dao.IDomainObjectDao;
import com.sitechasia.webx.core.model.IDomainObject;
import com.sitechasia.webx.core.support.Page;

/**
 * 逻辑、功能相关描述:
 *
 * @author daibiao 编写日期：2008-1-25
 */

public interface IPmsBaseDao<D extends IDomainObject> extends IDomainObjectDao<D> {

	/**
	 * 功能描述:日志对象<br>
	 * @return<br>
	 * Create author:罗军林<br>
	 * Create on:2008-9-2<br>
	 * Edit author:<br>
	 * Edit on:<br>
	 * Why:<br>
	 */
	public Logger getLogger();

	/**
	 * Function:分页查询
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public Page pagedQueryByPageNo(String hql, int pageNo, int pageSize, Object[] parameters);

	/**
	 * Function:分页查询
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public Page pagedQueryByPageNo(String hql, int pageNo, int pageSize);

	/**
	 * Function:原生sql查询
	 * @param
	 * @return
	 * Create author:yinxiaoqiing
	 * Create on:2008-3-13
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public Page pagedSqlQueryByPageNo( String sql,int currentPage,int pageSize,Object[] parameters);
	/**
	 * Function:原生sql查询
	 * @param
	 * @return
	 * Create author:yinxiaoqiing
	 * Create on:2008-3-13
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public Page pagedSqlQueryByPageNo( String sql,int currentPage,int pageSize);
	/**
	 * Function:添加实体
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public D saveObject(D d);

	/**
	 * Function:修改实体
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public D updateObject(D d);

        /**
	 * Function:添加或修改实体
	 * @param
	 * @return
	 * Create author:huxu
	 * Create on:2008-4-15
	 * Edit author:
	 * Edit on:
	 * Why:UI需求
	 */
	public D saveOrUpdateObject(D d);


	/**
	 * Function:根据Id查询实体
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public D findById(Serializable id);

	/**
	 * Function:列出所有实体
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public List<D> findAll();

	 /**
	 * Function:根据Id删除实体
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public void deleteObjectById(Serializable id);

	 /**
	 * Function:根据Ids数组批量删除实体
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public void deleteObjectByIds(Serializable ids[]) ;

	 /**
	 * Function:根据属性名称及值查询实体列表
	 * @param
	 * @return
	 * @see
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why: 此方法因数据权限拦截问题禁止使用
	 */
	//@Deprecated
	//public List<D> findBy(String name, Object value);

	/**
	 * Function:根据属性名称及值查询唯一实体
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why: 此方法因数据权限拦截问题禁止使用
	 */
	//@Deprecated
	//public D findUniqueBy(String name, Object value);

	 /**
	 * Function:根据属性名称及值模糊查询实体列表
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why: 此方法因数据权限拦截问题禁止使用
	 */
	//@Deprecated
	//public List<D> findByLike(String name, String value);

	/**
	 * 功能描述： 返回查询语句范围内的所有数据的数组
	 *
	 * @param queryStr: 查询语句
	 * @param paremeters
	 */
	public List findAllResult(String queryStr, Object... paramenters);

	 /**
	 * Function:删除实体
	 * @param
	 * @return
	 * Create author:daibiao
	 * Create on:2008-1-28
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public void deleteObject(D o);

	public Date getDate() ;


	/**
	 * Function:执行原生sql
	 * @param sql
	 * @param args  注入的参数数组
	 * @return
	 * Create author:yuguogang
	 * Create on:2008-3-24
	 * Edit author:
	 * Edit on:
	 * Why:
	 * @throws Exception
	 */
	public void executeSQL(String sql,Object[] args) throws Exception;

	public void executeSQL(final String sql,final Object[][] args);

	/**
	 * Function:根据Criteria查询实体列表
	 * @param Criteria
	 * @return List<D>
	 * Create author:付湘辉
	 * Create on:2008-5-12
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public List<D> queryObjects(Criteria c);

	/**
	 * Function:根据给定 Criteria 查询单个实体
	 * @param Criteria
	 * @return Object
	 * Create author:付湘辉
	 * Create on:2008-5-12
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public Object findUnique(Criteria c);


	/**
	 * 功能描述:根据给定根据条件组装一个Criteria对象
	 * @param String name
	 * @param Object value
	 * @return Criteria
	 * Create author:燕大为
	 * Create on:2008-5-21
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public Criteria crtieriaFindBy(String name , Object value);

	/**
	 * 功能描述:根据给定根据条件(支持模糊查询)组装一个Criteria对象
	 * @param String name
	 * @param Object value
	 * @return Criteria
	 * Create author:燕大为
	 * Create on:2008-5-21
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public Criteria criteriaFindByLike(String name , String value);


	/**
	 * 功能描述:根据给定根据条件(唯一查询)组装一个Criteria对象
	 * @param String name
	 * @param Object value
	 * @return Criteria
	 * Create author:燕大为
	 * Create on:2008-5-21
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public Criteria criteriaFindUniqueBy(String name , Object value) ;


	/**
	 * 功能描述:批量插入<br>
	 * @param sql
	 * @param parameters<br>
	 * Create author:罗军林<br>
	 * Create on:2008-8-13<br>
	 * Edit author:<br>
	 * Edit on:<br>
	 * Why:<br>
	 */
	public void executeSQLBatch(final String sql,final List<Object[]> parameters);

	public void flush();

	public void clear();

	/**
	 * 功能描述:加载指定标识的对象,仅为该对象的代理<br>
	 * @param entiyClass
	 * @param id
	 * @return<br>
	 * Create author:罗军林<br>
	 * Create on:2008-12-8<br>
	 * Edit author:<br>
	 * Edit on:<br>
	 * Why:<br>
	 */
	public D loadById(Serializable id);

	/**
	 * 功能描述:原生SQL的命名参数查询<br>
	 * @param queryStr
	 * @param parameter
	 * @return<br>
	 * Create author:罗军林<br>
	 * Create on:2008-12-23<br>
	 * Edit author:<br>
	 * Edit on:<br>
	 * Why:<br>
	 */
	public Query createNameSQLQuery(String queryStr, Map parameter);

	/**
	 * 功能描述: 分页查询，支持SQL语句命名参数的查询
	 * @param hql: 查询语句
	 * @param currentPage : 当前页码
	 * @param pagesize： 每页的记录数
	 * @param parameters ： 命名参数的键值
	 * Edit author: 罗军林
	 * Edit on: 2008-12-23
	 *
	 * @return 分页对象
	 */
	public Page pagedSqlNameQueryByPageNo(String sql,int currentPage,int pageSize,Map parameter);
}
